/**
 * pharma-process - 27 mai 2011 guillaume
 */
package org.bspv.pharma.process;

import java.util.List;

import org.bspv.pharma.common.exception.EntityNotFoundException;
import org.bspv.pharma.common.exception.ViolatedBusinessRuleException;
import org.bspv.pharma.model.Order;
import org.bspv.pharma.model.OrderDetail;

/**
 * @author guillaume
 * 
 */
public interface ManagementProcessService {

    /**
     * Supprime la commande dont l'identifiant est en paramètre.
     * 
     * @param orderId
     *            Identifiant de la commande à supprimer
     * @param comment
     *            Commentaire
     * @param userId
     *            Identifiant de l'utilisateur
     * @throws EntityNotFoundException
     *             Exception lancée si aucune commande trouvée pour cet identifiant
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour la suppression
     */
    void deleteOrderById(Long orderId, String comment, Long userId) throws EntityNotFoundException,
            ViolatedBusinessRuleException;

    /**
     * Annule la commande dont l'identifiant est en paramètre.
     * 
     * @param orderId
     *            Identifiant de la commande à annuler
     * @param comment
     *            Commentaire
     * @param userId
     *            Identifiant de l'utilisateur responsable de l'annulation
     * @throws EntityNotFoundException
     *             Exception lancée si aucune commande trouvée pour cet identifiant
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour l'annulation
     */
    void cancelOrderById(Long orderId, String comment, Long userId) throws EntityNotFoundException,
            ViolatedBusinessRuleException;

    /**
     * Envoi la commande dont l'identifiant est en paramètre.
     * 
     * @param id
     *            Identifiant de la commande à annuler
     * @param comment
     *            Commentaire
     * @param userId
     *            Identifiant de l'utilisateur responsable de l'annulation
     * @throws EntityNotFoundException
     *             Exception lancée si aucune commande trouvée pour cet identifiant
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour l'envoi
     */
    void sendOrderById(Long orderId, String comment, Long userId) throws EntityNotFoundException,
            ViolatedBusinessRuleException;

    /**
     * Début de la réception d'une commande.
     * 
     * @param orderId
     *            Identifiant de la commande à réceptionner
     * @param comment
     *            Commentaire
     * @param userId
     *            Identifiant de l'utilisateur responsable de la réception
     * @throws EntityNotFoundException
     *             Exception lancée si aucune commande trouvée pour cet identifiant
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour la réception
     */
    void beginOrderDelivery(Long orderId, String comment, Long userId) throws EntityNotFoundException,
            ViolatedBusinessRuleException;

    /**
     * Fin de la réception d'une commande. (mise à jour de la commande)
     * 
     * @param orderId
     *            Identifiant de la commande à réceptionner
     * @param comment
     *            Commentaire
     * @param userId
     *            Identifiant de l'utilisateur responsable de la réception
     * @throws EntityNotFoundException
     *             Exception lancée si aucune commande trouvée pour cet identifiant
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour la clôture de la réception
     */
    void completeOrderDelivery(Long orderId, String comment, Long userId) throws EntityNotFoundException,
            ViolatedBusinessRuleException;

    /**
     * Enregistre la commande en paramètre et son évènement de création.
     * 
     * @param drugstoreId
     *            Identifiant de la pharmacie concernée.
     * @param orderComment
     *            Commentaire de la commande
     * @param orderDescription
     *            Description de la commande
     * @param comment
     *            Commentaire
     * @param userId
     *            Identifaint de l'utilisateur responsable de la création
     * @return La commande nouvellement créée
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si la commande ne respecte pas les règles de gestion requise
     *             pour la création
     */
    Order createOrder(Long drugstoreId, String orderComment, String orderDescription, String comment, Long userId)
            throws EntityNotFoundException, ViolatedBusinessRuleException;

    /**
     * Ajoute une quantité de fournitures à une commande.
     * 
     * @param orderId
     *            Identifiant de la commande
     * @param typeOfSupplyId
     *            Identifiant du type de fourniture
     * @param quantity
     *            Quantité
     * @throws EntityNotFoundException
     *             Exception lancée si aucune commande ou aucune fourniture ne sont trouvées pour
     *             ces identifiants
     * @throws ViolatedBusinessRuleException
     *             Exception lancée si l'ajout de fourniture à la commande n'est pas possible
     */
    void updateOrderDetail(Long orderId, Long typeOfSupplyId, Integer quantity) throws EntityNotFoundException,
            ViolatedBusinessRuleException;

    /**
     * Retourne la liste des détails d'une commande
     * 
     * @param orderId
     *            Identifiant de la commande.
     * @return Liste des détails de la commande
     * @throws EntityNotFoundException
     *             Exception lancée si aucune commande n'est trouvée pour cet identifiant.
     */
    List<OrderDetail> findOrderDetails(Long orderId) throws EntityNotFoundException;

}
